package cn.zzf.leetcode;

/**
 * <pre>{@code
 * 七个不同的符号代表罗马数字，其值如下：
 *
 * 符号	值
 * I	1
 * V	5
 * X	10
 * L	50
 * C	100
 * D	500
 * M	1000
 * 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则：
 *
 * 如果该值不是以 4 或 9 开头，请选择可以从输入中减去的最大值的符号，将该符号附加到结果，减去其值，然后将其余部分转换为罗马数字。
 * 如果该值以 4 或 9 开头，使用 减法形式，表示从以下符号中减去一个符号，例如 4 是 5 (V) 减 1 (I): IV ，9 是 10 (X) 减 1 (I)：IX。仅使用以下减法形式：4 (IV)，9 (IX)，40 (XL)，90 (XC)，400 (CD) 和 900 (CM)。
 * 只有 10 的次方（I, X, C, M）最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V)，50 (L) 或 500 (D)。如果需要将符号附加4次，请使用 减法形式。
 * 给定一个整数，将其转换为罗马数字。
 *
 * 示例 1：
 * 输入：num = 3749
 * 输出： "MMMDCCXLIX"
 * 解释：
 * 3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
 *  700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
 *   40 = XL 由于 50 (L) 减 10 (X)
 *    9 = IX 由于 10 (X) 减 1 (I)
 * 注意：49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
 *
 * 示例 2：
 * 输入：num = 58
 * 输出："LVIII"
 *
 * 解释：
 * 50 = L
 *  8 = VIII
 *
 * 示例 3：
 * 输入：num = 1994
 * 输出："MCMXCIV"
 *
 * 解释：
 * 1000 = M
 *  900 = CM
 *   90 = XC
 *    4 = IV
 *
 * 提示：
 * 1 <= num <= 3999
 * }</pre>
 * @author zzf
 * @date 2025-06-04 10:01
 */
public class T0012_IntToRoman {

    public static String intToRoman(int num) {
        String result = "";

        int i = num % 10;
        int j = num / 10;
        result += compute("I", "V", "X", i);
        if (j == 0) {
            return result;
        }

        i = j % 10;
        result = compute("X", "L", "C", i) + result;
        if (j == 0) {
            return result;
        }

        j = j / 10;
        i = j % 10;
        result = compute("C", "D", "M", i) + result;
        if (j == 0) {
            return result;
        }

        j = j / 10;
        i = j % 10;
        result = compute("M", "*", "*", i) + result;
        if (j == 0) {
            return result;
        }


        return result;
    }

    public static String compute(String one, String five, String ten, int num) {
        String result = "";
        if (num <= 3) {
            while (num > 0) {
                result += one;
                num--;
            }
        } else if (num == 4) {
            result += one + five;
        } else if (num == 5) {
            result += five;
        } else if (num <= 8) {
            result += five;
            while (num > 5) {
                result += one;
                num--;
            }
        } else if (num == 9) {
            result += one + ten;
        } else {
            // 10的倍数
        }
        return result;
    }


    private final static String[] thousands = {"", "M", "MM", "MMM"};
    private final static String[] hundreds  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
    private final static String[] tens      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
    private final static String[] ones      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

    public static String intToRoman1(int num) {
        StringBuffer roman = new StringBuffer();
        roman.append(thousands[num / 1000]);
        roman.append(hundreds[num % 1000 / 100]);
        roman.append(tens[num % 100 / 10]);
        roman.append(ones[num % 10]);
        return roman.toString();
    }

    public static void main(String[] args) {
        System.out.println(intToRoman(3749));
        System.out.println(intToRoman(58));
        System.out.println(intToRoman(1994));
        System.out.println(intToRoman(3749));
        System.out.println(intToRoman(58));
        System.out.println(intToRoman(1994));
    }

}
